package day13;

import java.util.concurrent.*;

//测试可周期定长线程池
public class Demo2 {
    static volatile int count = 12; //烟花的数量
    public static void main(String[] args) {
        /*RejectedExecutionHandler handler  = null;
        ThreadPoolExecutor.AbortPolicy();
        ThreadPoolExecutor.CallerRunsPolicy();
        ThreadPoolExecutor.DiscardOldestPolicy();
        ThreadPoolExecutor.DiscardPolicy();*/

        //1.支持原来的基础操作exector()执行任务
        ExecutorService es = Executors.newScheduledThreadPool(3);
        /*for (int i = 0; i < 100; i++) {
            es.execute(()->{
                try {
                    System.out.println(Thread.currentThread().getName());
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        es.shutdown();*/

        //2.延迟操作：属于子类的方法
        //ScheduledExecutorService ses = Executors.newScheduledThreadPool(3);
        //ses.schedule(Runnable类型,首次延迟时间,单位);
        /*for (int i = 0; i < 10; i++) {
            ses.schedule(() -> {    //表示5秒之后开始操作
                try {
                    System.out.println(Thread.currentThread().getName());
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }, 5, TimeUnit.SECONDS);
        }
        ses.shutdown();*/

        //3.周期操作：属于子类的方法
        //ses.scheduleAtFixedRate(Runnable类型,首次延迟时间,周期时间,单位);
        /*ses.scheduleAtFixedRate(() -> {
                System.out.println(Thread.currentThread().getName());
        }, 5, 3, TimeUnit.SECONDS);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //关闭线程池,上面的周期任务也会关闭
        ses.shutdown();*/


        //案例：通过可周期定长线程池模拟燃放烟花的过程
        //首先点燃引线需要5S(延迟)    之后每个2S(周期)发射一个烟花
        //一共发射12个烟花     发射完毕()关闭池    在显示 “新年快乐”
        ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
        System.out.println("点燃了烟花的引线!!!");
        ses.scheduleAtFixedRate(() -> {
            //第一次发生 开始燃放烟花
            if (count == 12) {
                System.out.println("开始燃放烟花!");
            }
            System.out.println("发射第" + (13 - count) + "枚烟花");
            count--;
        }, 5, 2, TimeUnit.SECONDS);
        //控制燃放结束
        while (count > 0) {//监听是否是最后一枚
        }
        System.out.println("烟花燃放完毕,新年快乐!");
        ses.shutdown();
    }
}
